#ifndef __IEEE_1547_H
#define __IEEE_1547_H

#include "allThread.h"


// #define IEEE_1547_DEBUG_MODE                        /* 调试模式 */
#define IEEE_1547_INPUT_RANGE_CHECK         0       /* 输入范围检测 */
#define IEEE_1547_THREAD_POLLING_INTERVAL   500     /* 线程轮询间隔(ms) */


typedef enum
{
    VQ_POINT1,
    VQ_POINT2,
    VQ_POINT3,
    VQ_POINT4,
    VQ_POINT_QTY,
} modeVQ_Point_t;


typedef enum
{
    PQ_POINT3B,
    PQ_POINT2B,
    PQ_POINT1B,
    PQ_POINT1A,
    PQ_POINT2A,
    PQ_POINT3A,
    PQ_POINT_QTY,
} modePQ_Point_t;
    

typedef enum
{
    VP_POINT1,
    VP_POINT2,
    VP_POINT_QTY,
} modeVP_Point_t;
    

typedef enum
{
    MODE_CPF = 0,   /* 恒功因 */
    MODE_VQ  = 1,   /* 电压无功 */
    MODE_PQ  = 2,   /* 有功无功 */
    MODE_CQ  = 3,   /* 恒无功 */
    MODE_VP  = 4,   /* 电压有功 */
    MODE_FP  = 5,   /* 频率有功 */
    MODE_PL  = 6,   /* 有功限制 */
    MODE_QTY,
} mode1547_t;


typedef enum
{
    MODE_SWITCH_OFF,    /* 关闭 */
    MODE_SWITCH_ON,     /* 打开 */
    MODE_SWITCH_QTY,
} modeSwitch_t;


/**
 * @brief 恒功因模式-功因设定
 */
int Ieee1547_ModeCPF_SetPf(int16_t pfSet);

/**
 * @brief 恒功因模式-有功设定
 */
void Ieee1547_ModeCPF_SetActPwr(int16_t actPwrSet);

/**
 * @brief 电压无功模式-电压参考设定
 */
int Ieee1547_ModeVQ_SetVolRef(uint16_t volRefSet);

/**
 * @brief 电压无功模式-电压控制点设定
 */
int Ieee1547_ModeVQ_SetVol(uint16_t volSet, modeVQ_Point_t modeVQ_Point);

/**
 * @brief 电压无功模式-无功控制点设定
 */
int Ieee1547_ModeVQ_SetReactPwr(int16_t reactPwrSet, modeVQ_Point_t modeVQ_Point);

/**
 * @brief 电压无功模式-响应时间设定
 */
int Ieee1547_ModeVQ_SetRespTime(uint16_t respTimeSet);

/**
 * @brief 有功无功模式-有功控制点设定
 */
int Ieee1547_ModePQ_SetActPwr(int16_t actPwrSet, modePQ_Point_t modePQ_Point);

/**
 * @brief 有功无功模式-无功控制点设定
 */
int Ieee1547_ModePQ_SetReactPwr(int16_t reactPwrSet, modePQ_Point_t modePQ_Point);

/**
 * @brief 恒无功模式-无功设定
 */
void Ieee1547_ModeCQ_SetReactPwr(int16_t reactPwrSet);

/**
 * @brief 电压有功模式-电压控制点设定
 */
int Ieee1547_ModeVP_SetVol(uint16_t volSet, modeVP_Point_t modeVP_Point);

/**
 * @brief 电压有功模式-有功控制点设定
 */
int Ieee1547_ModeVP_SetActPwr(int16_t actPwrSet, modeVP_Point_t modeVP_Point);

/**
 * @brief 电压有功模式-响应时间设定
 */
int Ieee1547_ModeVP_SetRespTime(uint16_t respTimeSet);

/**
 * @brief 电压有功模式-吸收功率设定
 */
void Ieee1547_ModeVP_SetAbsorbActPwr(int16_t absorbPwrSet);

/**
 * @brief 频率有功模式-欠频死区设定
 */
int Ieee1547_ModeFP_SetDbUf(uint16_t dbUfSet);

/**
 * @brief 频率有功模式-可提供功率设定
 */
int Ieee1547_ModeFP_SetPavl(uint16_t pAvlSet);

/**
 * @brief 频率有功模式-欠频调频系数设定
 */
int Ieee1547_ModeFP_SetKuf(uint16_t kUfSet);
/**
 * @brief 频率有功模式-过频死区设定
 */
int Ieee1547_ModeFP_SetDbOf(uint16_t dbOfSet);

/**
 * @brief 频率有功模式-最小可吸收功率设定
 */
int Ieee1547_ModeFP_SetPmin(int16_t pMinSet);

/**
 * @brief 频率有功模式-过频调频系数设定
 */
int Ieee1547_ModeFP_SetKof(uint16_t kOfSet);

/**
 * @brief 频率有功模式-响应时间设定
 */
int Ieee1547_ModeFP_SetRespTime(uint16_t respTimeSet);

/**
 * @brief 频率有功模式-扰动功率设定
 */
void Ieee1547_ModeFP_SetActPwr(int16_t actPwrSet);

/**
 * @brief 有功限制模式-最大功率限制设定
 */
int Ieee1547_ModePL_SetPmax(uint16_t pMaxSet);

/**
 * @brief 模式开关设定
 */
void Ieee1547_SetModeSwitch(mode1547_t mode, modeSwitch_t modeSwitch);

/**
 * @brief 模式开关获取
 */
modeSwitch_t Ieee1547_GetModeSwitch(mode1547_t mode);

void Ieee1547_Thread(void *pParam);
int Ieee1547_SendMessage(void);
int Ieee1547_DeleteTimer(void);
int Ieee1547_GetTimerId(void);

#endif

